package com.administrator.scoreManageSys.utils;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.OutputStream;
import java.util.List;
import java.util.Map;

/**
 *   list导出excel
 * @author zsh
 * @date 2022/04/07/ 15:30
 */
public class ExportExcelList {
    public boolean isLand = false;
    /***
     * 工作簿
     */
    private HSSFWorkbook workbook;

    /***
     * sheet
     */
    private HSSFSheet sheet;
    /***
     * 标题行开始位置
     */
    private int TITLE_START_POSITION = 0;

    /***
     * 时间行开始位置
     */
    private int DATEHEAD_START_POSITION = 1;

    /***
     * 表头行开始位置
     */
    private int HEAD_START_POSITION = 1;

    /***
     * 文本行开始位置
     */
    private int CONTENT_START_POSITION = 2;

    /**
     * @param dataList  对象集合
     * @param titleMap  表头信息（对象属性名称->要显示的标题值)[按顺序添加]
     * @param sheetName sheet名称和表头值
     */
    public void excelExport(List<Map<String, Object>> dataList, Map<String, String> titleMap, OutputStream out, String sheetName, Integer[] headersL, int type) {
        // 初始化workbook
        initHSSFWorkbook(sheetName);
        // 标题行
        createTitleRow(titleMap, sheetName);
        // 时间行
//	    createDateHeadRow(titleMap);
        // 表头行
        createHeadRow(titleMap, headersL);
        // 文本行
        if (type == 1) {
            createContentRowByTitleMap(dataList, titleMap);
        }
        // 写入处理结果
        try {
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     *
     * @param sheetName
     */
    private void initHSSFWorkbook(String sheetName) {
        workbook = new HSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
        HSSFPrintSetup ps = sheet.getPrintSetup();
        // 打印方向，true：横向，false：纵向(默认)
        ps.setLandscape(isLand);
        ps.setVResolution((short) 600);
        // 纸张类型
        ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);
    }

    /**
     * 生成标题（第零行创建）
     *
     * @param titleMap  对象属性名称->表头显示名称
     * @param sheetName sheet名称
     */
    private void createTitleRow(Map<String, String> titleMap, String sheetName) {
        CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1);
        sheet.addMergedRegion(titleRange);
        HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
        HSSFCell titleCell = titleRow.createCell(0);
        HSSFCellStyle styleTitle = workbook.createCellStyle();
        // 文字水平居中
        styleTitle.setAlignment(HorizontalAlignment.CENTER);
        // 文字垂直居中
        styleTitle.setVerticalAlignment(VerticalAlignment.CENTER);
        HSSFFont fontTitle = workbook.createFont();
        fontTitle.setColor(IndexedColors.GREY_80_PERCENT.index);
        fontTitle.setFontHeightInPoints((short) 18);
        styleTitle.setFont(fontTitle);
        titleCell.setCellStyle(styleTitle);
        titleCell.setCellValue(sheetName);
    }

    /**
     * 创建表头行（第二行创建）
     *
     * @param titleMap 对象属性名称->表头显示名称
     */
    private void createHeadRow(Map<String, String> titleMap, Integer[] headersL) {
        // 第1行创建
        HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
        int i = 0;
        for (String entry : titleMap.keySet()) {
            HSSFCell headCell = headRow.createCell(i);
            sheet.setColumnWidth(i, headersL[i] * 256);
            HSSFCellStyle style = workbook.createCellStyle();
            // 底部边框线样式(细实线)
            style.setBorderBottom(BorderStyle.THIN);
            // 右边框线样式(细实线)
            style.setBorderRight(BorderStyle.THIN);
            // 文字水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 文字垂直居中
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setFontName("黑体");
            font.setColor(IndexedColors.GREY_80_PERCENT.index);
            font.setFontHeightInPoints((short) 10);
            // 把字体应用到当前的样式
            style.setFont(font);
            //设置只读
            style.setLocked(true);
            headCell.setCellValue(titleMap.get(entry));
            headCell.setCellStyle(style);
            i++;
        }
    }
    /**
     * @param dataList 对象数据集合
     */
    private void createContentRowByTitleMap(List<Map<String, Object>> dataList, Map<String, String> titleMap) {
        try {
            HSSFCellStyle cellStyle = workbook.createCellStyle();
            HSSFCellStyle style = workbook.createCellStyle();
            // 文字垂直居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 底部边框线样式(细实线)
            cellStyle.setBorderBottom(BorderStyle.THIN);
            // 右边框线样式(细实线)
            cellStyle.setBorderRight(BorderStyle.THIN);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setFontName("宋体");
            font.setColor(IndexedColors.GREY_80_PERCENT.index);
            font.setFontHeightInPoints((short) 12);
            // 把字体应用到当前的样式
            cellStyle.setFont(font);
            for (int i = 0; i < dataList.size(); i++) {
                Map<String, Object> map = dataList.get(i);
                HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
                int j = 0;
                for (String entry : titleMap.keySet()) {
                    //根据标题键获取对应的值
                    String value = map.get(entry).toString();

                    HSSFCell textRowCell = textRow.createCell(j);
//                    cellStyle.setWrapText(true);//自动换行
                    textRowCell.setCellValue(value);
                    //textRow.getRowNum()：文本所在行下标，由于表头有2行，那么文本行应在表头行之后开始计数，也就是第三行，由于是下标，那么值应为2
                    //textRowCell.getColumnIndex()：所在列下标,第一列下标为0，以此类推
                    if (textRow.getRowNum() == 2 && textRowCell.getColumnIndex() == 14) {
                        HSSFCell cell = textRow.createCell(textRowCell.getColumnIndex());
                        style.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());//设置前景色-天蓝色
                        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置填充模式
                        style.setVerticalAlignment(VerticalAlignment.CENTER);// 文字垂直居中
                        style.setBorderBottom(BorderStyle.THIN);// 底部边框线样式(细实线)
                        style.setBorderRight(BorderStyle.THIN);// 右边框线样式(细实线)
                        style.setFont(font);// 把字体应用到当前的样式
                        cell.setCellValue(value);
                        cell.setCellStyle(style);
                    } else {
                        textRowCell.setCellStyle(cellStyle);
                    }

                    j++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
